package com.cskaoyan.javase.string._4api;

/**
 * @description: String常用API(方法)
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Scanner;

/**
 * String是开发中最常见的需要操作的对象，没有之一
 * String天天见，所以我们要对String的操作至少有个脸熟，大概知道String类能做什么
 * 以下方法不要求都背住，但是应该能够了解有这 些方法，并可以在实际开发中随着使用而熟记
 *
 *
 */
public class Demo {
    public static void main(String[] args) throws UnsupportedEncodingException {

        //1.判断功能
        //用来比较字符串的内容，注意区分大小写
        //boolean equals(Object obj)
        //忽略字符串大小写比较字符串内容，常见用于比较网址URL
        //boolean equalsIgnoreCase(String str)

        //判断当前字符串对象是否包含，目标字符串的字符序列，常见用于确定是否有盗链行为
        //boolean contains(String str)
        String s = "hello 小明";
        System.out.println(s.contains("小明"));


        //判断当前字符串对象，是否已目标字符串的字符序列开头
        //boolean startsWith(String str)
        //判断字符串开头
        System.out.println(s.startsWith("wu"));

        ////判断当前字符串，是否以目标字符串对象的字符序列结尾，常用于确定文件后缀名格式
        /**
         * 通过文件名判断一个文件是否是文件或者文件夹,正确吗?
         * 没有后缀名的就是文件夹,有后缀名的就是文件,对吗?
         * 不对
         *
         * 文件夹也可能有后缀名,文件也能没有后缀名
         */
        //boolean endsWith(String str)
        //判断字符串结尾
        System.out.println(s.endsWith("你好"));


        ////判断一个字符串，是不是空字符串
        //boolean isEmpty()
        String s1 = "";
        System.out.println(s1.isEmpty());


        // 获取当前字符串对象中，包含的字符个数
        //int length()
        System.out.println(s.length());
        //获取字符串对象代表字符序列中，指定位置的字符
        //字符串当中有char类型的value数组,所以字符串也有下标的概念,就是value数组的下标
        //该方法是常见的把String转换成char类型的方式之一
        //char charAt(int index)
        String s2 = "a";
        System.out.println(s2.charAt(0));
        //System.out.println(s2.charAt(1));
        //System.out.println(s2.charAt(-1));


        //在当前字符串对象中查找指定的字符，如果找到就返回字符，首次出现的位置(下标)，如果没找到返回-1
        //也可以填字符
        //int indexOf(int ch)
        String s3 = "hello world 张三先生! ah";
        System.out.println(s3.indexOf(97));
        System.out.println(s3.indexOf("hello"));

        //指定从当前字符串对象的指定位置开始，查找首次出现的指定字符的位置，(如果没找到返回-1)
        //可以填入字符
        //int indexOf(int ch,int fromIndex)

        //查找当前字符串中，目标字符串首次出现的位置(如果包含)，找不到，返回-1
        //这里的位置是指目标字符串的第一个字符,在当前字符串对象中的位置
        //int indexOf(String str)
        //指定，从当前字符串对象的指定位置开始,查找首次出现的指定字符串的位置(如果没找到返回-1)
        //这里的位置是指目标字符串的第一个字符,在当前字符串对象中的位置
        //int indexOf(String str,int fromIndex) ，


        //在Java的官方API当中,只要是涉及数组的区间,都是左闭右开的[start,end)
        //左闭是为了让左边能够从0开始,右开是为了让右边能够直接写数组的长度
        System.out.println(s3.indexOf("h", 1));


        //返回字符串，该字符串只包含当前字符串中，从指定位置开始(包含指定位置字符)到结束的那部分字符串
        //String substring(int start)
        String s4 = "我爱你中国!";
        System.out.println(s4.substring(3));

        ////返回字符串，只包含当前字符串中，从start位置开始(包含)，到end(不包含)指定的位置的字符串
        //String substring(int start,int end)
        System.out.println(s4.substring(0, s4.length()));


        //获取一个用来表示字符串对象字符序列的，字节数组,将字符串当中的字符转换成对应的编码值
        //byte[] getBytes()
        String s5 = "我爱你";
        byte[] bytes = s5.getBytes();
        System.out.println(Arrays.toString(bytes));
        //使用指定字符集，将字符编码成字节序列，并将结果存储到一个新的 byte 数组中
        //getBytes(String charsetName)
        //StandardCharsets.UTF_8 can be used instead
        byte[] bytes1 = s5.getBytes("UTF-8");
        System.out.println(Arrays.toString(bytes1));

        byte[] bytes2 = s5.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));

        //获取的是用来表示字符串对象字符序列的，字符数组
        //char[] toCharArray()
        System.out.println(Arrays.toString(s5.toCharArray()));

        //将字符从此字符串复制到目标字符数组
        //getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
        String s6 = "迎娶高帅富";
        char[] chs = new char[8];
        //src = source的缩写,源头的意思 源头是字符串,srcBegin srcEnd是字符串当中value数组要被拷贝元素的区间,左闭右开
        //dst = destination的缩写,目标的意思,目标是char数组,dst指的就是char数组,dstBegin是char数组中开始放元素的那个下标(包括)
        //aim target
        s6.getChars(2,5,chs,3);
        System.out.println(Arrays.toString(chs));
        System.out.println(chs);

        //把字符数组转换成字符串
        //static String valueOf(char[] chs)
        //把各种基本数据类型和对象转换成字符串
        //static String valueOf(int i/double...)

        //把字符串全部转化为小写
        //String toLowerCase()
        //把字符串全部转换为大写
        //String toUpperCase()
        //字符串拼接，作用等价于 + 实现的字符串拼接
        //字符串的拼接如果是较少次数的,可以直接用+号,但是次数较多就不能使用String了
        //String concat(String str)

        //在新的字符串中，用新(new)字符，替换旧(old)字符
        //String replace(char old,char new)
        ////在新的字符串中，用新的字符串(new), 替换旧(old)字符串
        //String replace(String old,String new)
        String s7 = "aaaababba";
        String s8 = s7.replace("b", "a");
        System.out.println(s8);
        //替换所有的空格,去除掉字符串中的所有空格
        String s9 = "  asdaaas  d  ASA  Sd  ad  ";
        String s10 = s9.replace(" ", "");
        System.out.println(s10);

        //在新的字符串中，去掉开头和结尾的空格字符
        //String trim()
        String s11 = s9.trim();
        System.out.println(s11);
    }
}
